上一篇講完了簡單的 Dockerfile 用法,接著就要來講一下比較深入的用法了。
首先先來看一下常用的 Dockerfile 指令
| Keyword | Discription | 
|---|---|
| FROM <image_name>[:<image_tag>] | 基礎映像。 | 
| COPY <src> <dest> | 複製。規則需符合 Go 的 filepath.Match。 | 
| ADD | 同 COPY,但複製 tar 壓縮文件時會自動解壓。同需求下推薦用 COPY | 
| RUN <command> orRUN ["command", "arg1", "arg2", ...] | 執行。在 Dockerfile build 時執行。 | 
| *CMD | 類似 RUN 。但在 docker run 時執行,且有多行時只會執行最後一行。如果啟動時有指定其他指令會被忽略。 | 
| *ENTRYPOINT | 類似 CMD 。但一定會被執行。 | 
| WORKDIR <dir_name> | 設定工作目錄。建立的工作目錄會存在於每一層。如果不存在會自動建立。 | 
| EXPOSE <port_number> | 開放 PORT。僅宣告,要連進該服務需使用 publish。 | 
| ENV <key>=<value> | 環境變數。 | 
| ARG | 類似 ENV 。但僅在 dockerfile 作用。 | 
* 如果有多行同時存在時,只會執行最後一行。
- Dockerfile 撰寫規則中規定必須包含至少 1 個
 CMD或ENTRYPOINT在內(但沒有好像也不會怎樣)。- Dockerfile 的指令每執行一次都會在 docker 上新建一層 (Layer)。所以過多無意義的層,會造成 Image 膨脹過大。
 - 最多到 127 層 (Layer)
 
接著我們一一介紹各個指令的用途吧。
第一個 FROM 昨天介紹過了,就是指定接下來的開發環境。
第二個 COPY 跟第三個 ADD 作用都是將檔案或資料夾複製到 Image 內,不過如果複製的檔案是 tar 的壓縮文件時, ADD 會自動解壓縮後再複製進去。官方文件中推薦如果沒有特殊需求建議使用 COPY 。
第四個 RUN 昨天也已經介紹過了,作用是在 Image 建立的過程中處裡某些東西,例如安裝套件或是其他的操作。
第五個 CMD 跟第六個 ENTRYPOINT 都是在啟動 Container 時才會執行的指令,
第七個 WORKDIR 昨天也介紹過了,就是指定接下來的工作目錄。
第八個 EXPOSE 昨天也介紹過了,就是宣告要開放的 PORT 。
第九個 ENV 跟第十個 ARG 都是用於設定環境變數,不過有點差別,我們先來看看個別作用個區域。

上面這張圖很清楚的標示了 ARG 跟 ENV 作用的區域, ARG 主要是在 Image 建立過程中使用的環境變數,大概就是安裝套件時用來指定版本使用; ENV 則是執行時所需使用的環境變數。
那麼就先到這邊, Dockerfile 的基本使用大概就是這樣, Dockerfile 超過一半以上都是在使用這些指令,只要使用熟悉,就可以順利地建構出各種 Image 了。
大家掰~掰~